<?php
// +----------------------------------------------------------------------+
// |                          Mailcertificado                             |
// +----------------------------------------------------------------------+
// |                     www.mailcertificado.com                          |
// +----------------------------------------------------------------------+
// |           Copyright (c) 2012 Servicios de Mailcertificado            |
// +----------------------------------------------------------------------+
// | Este programa es software libre. Puede distribuirlo  y/o modificarlo |
// | bajo los términos de la  licencia GNU General Public License  tal  y |
// | como la publica la Fundación de Software Libre, bajo la denominación |
// | GPL, en su versión 2 o posterior (versión inglesa).                  |
// |                                                                      |
// | This program is free software. You can redistribute it and/or modify |
// | it under the terms of the GNU General Public License as published by |
// | the Free Software Foundation; either version 2 or later of the GPL.  |
// +----------------------------------------------------------------------+
// | Autores/Authors:                                                     |
// |          Carlos Mora <ozonosp@gmail.com>       					  |
// +----------------------------------------------------------------------+
//
// $Id: Exp $
 
//Este archivo contiene las funciones para validación de campos en php
//Cuando se asigna funcion php de validación para un campo el sistema buscara en este archivo dicha función
//y la llamará pasándole como parámetros el valor del campo, el idioma y el nombre del campo que se está enviando.

//Por ejemplo si indica como función de validacion "sample" deberá declarar una función en este archivo con el siguiente formato 
// 
///**
// * Funcion de prueba, recibe el valor del campo, el idioma y el nombre del campo
// * @param string $valor 			Contenido del campo a validar
// * @param string $idioma 			Idioma seleccionado para los mensajes
// * @param string $nombreDeCampo	Nombre del campo que estamos validando
// * @return mixed string|true		Devuelve true si ok o un string con el error
// */
// function sample($valor,$idioma,$nombreDeCampo){ 
//		if($valor == 'ok' && elementname == 'username') return true; 
//		else if($idioma == 'es') return "El valor no es ok";
//		else return "Value isn't ok";
// }


/**
 * Comprueba que la contraseña es igual a la del campo password
 */
function checkEqualPass($pass2,$idioma,$campo){
	$valuePass1 = $_REQUEST['password'];
	$user = $_REQUEST['user'];
	if($user == $pass2) return 'El usuario no puede ser igual a la contraseña';
	if($pass2 == $valuePass1) return true;
	return 'Las contraseñas no coinciden';
}

/**
 * Comprueba el codigo captcha
 * @param unknown_type $codigo
 * @param unknown_type $idioma
 * @param unknown_type $campo
 */
function checkCaptcha($codigo,$idioma,$campo){
	//Comprobamos el captcha
	if(!isset($_SESSION)) session_start();
	//Si el codigo es válido
	if(isset($_SESSION['securimage_code_value']) && $codigo == $_SESSION['securimage_code_value'])	return true;
	return 'Código captcha inválido';
	
}

/**
 * Comprueba un numero de documento
 * @param string $document
 * @param string $idioma
 * @param string $campo
 */
function checkDocumentNumber($document,$idioma,$campo){
	
	if(empty($document)) return true; //Si esta vacío devuelve true
	$result = validarDocumento($document);
	if($campo == 'idNumber') $selectedoption = $_REQUEST['idType']; //Obtenemos la opción seleccionada para el campo idNumber
	if($campo == 'factIdNumber') $selectedoption = $_REQUEST['factIdType']; //Obtenemos la opción seleccionada para el campo factIdNumber
	
	if($result == 1 && $selectedoption == 'NIF') return true;
	if($result == 2 && $selectedoption == 'CIF') return true;
	if($result == 3 && $selectedoption == 'NIE') return true;
	if($selectedoption == 'Passport') return true;
	
	return 'El documento indicado es inválido';
}

/**
 * Comprueba un numero de vat europeo
 * @param string $document
 * @param string $idioma
 * @param string $campo
 */
function checkVatNumber($document,$idioma,$campo){

	if(empty($document)) return true; //Si esta vacío devuelve true
	
	$document = str_replace(array(' ','.','-',',',', '),'',strtoupper(trim($document)));
	$cc = substr($document, 0, 2);
	$vn = substr($document, 2);
	$client = new SoapClient("http://ec.europa.eu/taxation_customs/vies/checkVatService.wsdl");
	
	if($client){
		$params = array('countryCode' => $cc, 'vatNumber' => $vn);
		try{
			$r = $client->checkVat($params);
			if($r->valid == true) return true;
				else return 'Número VAT inválido';
				
		} catch(SoapFault $e){ return 'Check error: '.$e->faultstring; }
	} else {
		return 'VIES wdsl service fail';
	}
}

/**
 * Valida un nif cif o nie
 * @param unknown_type $cif
 * @return int	1 = NIF ok,2 = CIF ok,3 = NIE ok,-1 = NIF bad,-2 = CIF bad, -3 = NIE bad, 0 = ??? bad
 */
function validarDocumento($cif) {
	//Returns:
	// 1 = NIF ok,
	// 2 = CIF ok,
	// 3 = NIE ok,
	//-1 = NIF bad,
	//-2 = CIF bad,
	//-3 = NIE bad, 0 = ??? bad
	$cif = strtoupper($cif);

	for ($i = 0; $i < 9; $i ++){
		$num[$i] = substr($cif, $i, 1);
	}
	//si no tiene un formato valido devuelve error
	if (!ereg('((^[A-Z]{1}[0-9]{7}[A-Z0-9]{1}$|^[T]{1}[A-Z0-9]{8}$)|^[0-9]{8}[A-Z]{1}$)', $cif)){
			return 0;
	}
	//comprobacion de NIFs estandar

	if (ereg('(^[0-9]{8}[A-Z]{1}$)', $cif)){
		if ($num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE',substr($cif, 0, 8) % 23, 1)){
			return 1;
		}else {
			return -1;
		}
	}
	//algoritmo para comprobacion de codigos tipo CIF
	$suma = $num[2] + $num[4] + $num[6];
	for ($i = 1; $i < 8; $i += 2){
		$suma += substr((2 * $num[$i]),0,1) + substr((2 * $num[$i]),1,1);
	}
	$n = 10 - substr($suma, strlen($suma) - 1, 1);
	//comprobacion de NIFs especiales (se calculan como CIFs)
	if (ereg('^[KLM]{1}', $cif)){
		if ($num[8] == chr(64 + $n)){
			return 1;
		}else{
			return -1;
		}
	}
	//comprobacion de CIFs
	if (ereg('^[ABCDEFGHJNPQRSUVW]{1}', $cif)){
		if ($num[8] == chr(64 + $n) || $num[8] == substr($n, strlen($n) - 1, 1)){
			return 2;
		}else{
			return -2;
		}
	}
	//comprobacion de NIEs
	//T
	if (ereg('^[T]{1}', $cif)){
		if ($num[8] == ereg('^[T]{1}[A-Z0-9]{8}$', $cif)){
			return 3;
		}else{
			return -3;
		}
	}
	//XYZ
	if (ereg('^[XYZ]{1}', $cif)){
		if ($num[8] == substr('TRWAGMYFPDXBNJZSQVHLCKE',substr(str_replace(array('X','Y','Z'),array('0','1','2'), $cif), 0, 8) % 23, 1)){
			return 3;
		}else{
			return -3;
		}
	}
	//si todavia no se ha verificado devuelve error
	return 0;
}


?>